关于loader的作用和配置方法,在 初识webpack 这篇文章中已经讲过,本篇文章会讲常用的一些loader,并自己实现一个loader函数。
1. 转义es6
安装
1
| npm i @babel/core babel-loader @babel/preset-env -D
|
- babel-loader:它是使babel与webpack协同工作的模块
- @babel/core:是babel编译器的核心模块
- @babel/preset-env:官方推荐的预置器,可根据用户设置的目标环境自动添加所需的插件和补丁来编译es6代码
配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| rules: [ { test: /\.js$/, use: { loader: 'babel-loader', options: { cacheDirectory: true, presets: ['@babel/preset-env'] } } include: /src/, exclude: /node_modules/ } ]
|
2. 转义Ts
安装
1
| npm i ts-loader typescript
|
配置
1 2 3 4 5
| rules: [ { test: /\.ts$/, use: 'ts-loader', ]
|
与寻常loader不同的是,ts配置项是在工程目录下的tsconfig.json中
3. html-loader
用于将HTML文件转化为字符串并进行格式化,这使得外面可以把一个HTML片段通过js加载进来。
安装
配置
1 2 3 4 5
| rules: [ { test: /\.html$/, use: 'html-loader', ]
|
4. file-loader
用于打包文件类型的资源,并返回其publicPath
安装
配置
1 2 3 4 5
| rules: [ { test: /\.(jpe?g|png|gif)$/, use: 'file-loader', ]
|
5. url-loader
安装
配置
1 2 3 4 5 6 7 8 9 10 11 12
| rules: [ { test: /\.(jpe?g|png|gif)$/, use: { loader: 'url-loader', options: { limit: 10240, name: '[name].[ext]', publicPath: './assets-path/', }, }, ]
|
6. 加载样式
安装
1
| npm i style-loader css-loader less-loader -D
|
配置
1 2 3 4 5 6 7 8 9 10
| rules: [ { test: /.less$/, use: [ 'style-loader', 'css-loader', 'less-loader' ] }, ]
|
7. 自定义loader
我们将实现一个loader,它会为所有JS文件开启严格模式,也就是说它会在文件头部加上如下代码
force-strict-loader.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| var loaderUtils = require("loader-utils"); var SourceNode = require('source-map').SourceNode; var SourceMapConsumer = require('source-map').SourceMapConsumer;
module.exports = function (content, sourceMap) { var useStrictPrefix = '\'use strict\';\n\n'; if (this.cacheable) { this.cacheable(); } var options = loaderUtils.getOptions(this) || {}; if (options.sourceMap && sourceMap) { var currentReguest = loaderUtils.getCurrentRequest(this); var node = SourceNode.formStringWithSourceMap( content, new SourceMapConsumer(sourceMap) ); node.prepend(useStrictPrefix); var result = node.toStringWithSourceMap({ file: currentReguest}); var callback = this.async(); callback(null, result.code, result.map.toJSON()); } return useStrictPrefix + content; }
|
上面的插件提供了source-map的配置选项,source-map是一个信息文件,里面储存着位置信息,在debug的时候就会显示原文件的信息和位置,而不是转化后的信息。
使用方法
1 2 3 4 5 6
| use: { loader: 'force-strict-loader', options: { sourceMap: true, } }
|
参考
《Webpack实战入门、进阶与调优》
https://juejin.cn/post/6844903599080734728#heading-14
http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html